#include <iostream>
#include <cuda_runtime.h>
#include "../common/common.h"
#define DEVICENUM 0

// 1. 在主机端，devData只是一个标识符，不是设备全局内存的变量地址
// 2. 在核函数中，devData就是一个全局内存中的变量。
__device__ float devData; // __device__修饰的是静态全局内存,主机代码是无法访问
__global__ void AddGlobalVariable()
{
    devData += 2.0; // 可以核函数中访问，此时devData是一个全局内存的变量。
}

int main(int argc, char **argv)
{
    float value = 3.14f;
    // std::cout << "gpu全局变量 devData=" << devData << std::endl; // 主机代码访问，会报警告,但仍然会运行
    cudaMemcpyToSymbol(devData, &value, sizeof(float)); // 此时不能用cudaMemcpy,因为它用于动态分配
    AddGlobalVariable<<<1, 1>>>();
    // 设备变量devData在代码中定义的时候其实就是一个指针，这个指针指向何处，主机端是不知道的，指向的内容也不知道，
    // 想知道指向的内容，唯一的办法还是通过下面的函数显式的办法传输到value中：
    cudaMemcpyFromSymbol(&value, devData, sizeof(float));
    std::cout << "result=" << value << std::endl;
    cudaDeviceReset();
    return 0;
}